clc
clear

limU      = 7;
limSteps  = 1000;
listUsers = 2 : limU;

%% генерация M-последовательностей
Ms   = generate_Ms(limU);
lenM = size(Ms, 2);

intercorrelation = sum( Ms(1,:) .* Ms(1,:) );

Perrs = zeros(1, limU-1);

for numUsers = listUsers   
    for l = 1 : limSteps
        
        %% конструирование потока сообщений от пользователей
        % - соответствует передаче 0
        %   соответствует передаче 1
        Users = zeros( numUsers, 12*lenM);
        for i = 1 : numUsers
            % 12 последовательностей
            Users(i,:) = [...
                randSign() * Ms(i,:), randSign() * Ms(i,:),...
                randSign() * Ms(i,:), randSign() * Ms(i,:),...
                randSign() * Ms(i,:), randSign() * Ms(i,:),...
                randSign() * Ms(i,:), randSign() * Ms(i,:),...
                randSign() * Ms(i,:), randSign() * Ms(i,:),...
                randSign() * Ms(i,:), randSign() * Ms(i,:) ];
        end
        
        %% выбор порогового значения
        threshold = ( intercorrelation + maxCorrelation(Ms, numUsers) ) / 2;
        fprintf( 'Threshold = %d ', threshold ); fprintf('\n\n')
        
        %% конструирование общей последовательности
        
        [res, Shs] = superimpose(Users, lenM);
        
        %% демодуляция
        
        [nSeq, err] = detector( res, Ms, Shs, Users, threshold, numUsers, lenM );
        
        %% вероятность ошибки
        Perrs(numUsers-1) = Perrs(numUsers-1) + ( err/(limSteps * nSeq) );
    end
    
end

% график зависимости вероятности ошибки от числа пользователей
figure(1);
semilogy(listUsers, Perrs, 'k-*')
title('Asynchronous binary transfer')
xlabel('number of users')
ylabel('P_{e}')
grid on